package com.tabnet.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.tabnet.beans.Adresse;

public class AdresseDAOImpl implements DAOAdresse {

	private static final String SQL_SELECT_BY_ID  		= "SELECT id, rue, cp, ville, pays FROM Adresse a WHERE id = ?";
	private static final String SQL_INSERT_ADRESSE 		= "INSERT INTO Adresse (id, rue, cp, ville, pays) VALUES (?, ?, ?, ?, ?);";
	private static final String SQL_UPDATE_ADRESSE 		= "UPDATE Adresse SET rue = ?, cp = ?, ville = ?, pays = ? WHERE id = ?;";

    private DAOFactory daoFactory;
	
    public AdresseDAOImpl( DAOFactory daoFactory ) {
        this.daoFactory = daoFactory;
    }
    
	@Override
	public Adresse trouverAdr(int id) throws DAOException {
		Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Adresse adr = new Adresse();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            /*
             * Préparation de la requête avec les objets passés en arguments
             * (ici, uniquement un id) et exécution.
             */
            preparedStatement =  DAOUtilitaire.initialisationRequetePreparee( connexion, SQL_SELECT_BY_ID, false, id );
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données retournée dans le ResultSet */
            if ( resultSet.next() ) {
            	adr.set_Numero( resultSet.getInt("id") );
            	adr.set_Rue(resultSet.getString( "rue" ));
            	adr.set_CodePostal(resultSet.getString( "cp" ));
            	adr.set_Ville(resultSet.getString( "ville" ));
            	adr.set_Pays(resultSet.getString( "pays" ));
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            DAOUtilitaire.fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }

        return adr;
	}

	@Override
	public void addAdresse(Adresse adr) throws DAOException {
        //insertion adresse
		Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            connexion = daoFactory.getConnection();
            
            // insertion de l'adresse
            preparedStatement = DAOUtilitaire.initialisationRequetePreparee( connexion, SQL_INSERT_ADRESSE, true,
        		    adr.get_Numero(), adr.get_Rue(), adr.get_CodePostal(),
                            adr.get_Ville(), adr.get_Pays() );

            int statut = preparedStatement.executeUpdate();
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de l'adresse du fournisseur, aucune ligne ajoutée dans la table." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
        	 DAOUtilitaire.fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
	}

	@Override
	public void updAdresse(Adresse adr) throws DAOException {
		//modification de l'adresse
		Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            connexion = daoFactory.getConnection();
            
            // insertion de l'adresse
            preparedStatement = DAOUtilitaire.initialisationRequetePreparee( connexion, SQL_UPDATE_ADRESSE, true,
        		    	adr.get_Rue(), adr.get_CodePostal(), adr.get_Ville(), adr.get_Pays(), adr.get_Numero() );
                            

            int statut = preparedStatement.executeUpdate();
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de l'adresse du fournisseur, aucune ligne ajoutée dans la table." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
        	 DAOUtilitaire.fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
	}

}
